package com.hooper.solution.day15;

import java.util.*;

/**
 * @author Tim Hooper
 * @version 1.0
 * @time 2023/04/10/0:08
 */
class Solution {
    /**
     * 面试题 16.15. 珠玑妙算
     * 珠玑妙算游戏（the game of master mind）的玩法如下。
     * <p>
     * 计算机有4个槽，每个槽放一个球，颜色可能是红(R)，黄(Y)，绿(G)或蓝(B)。例如，计算机可能有RGGB(槽1为红色，槽2、3为绿色，槽4为蓝色)的颜色组合。
     * <p>
     * 作为用户，你试图猜出颜色组合。要是猜中了某个颜色，就在相应槽中放一个白色的球(提示)。要是只猜中颜色的正确位置，就放一个黑色的球(提示)。注意，只有在某个槽中放了提示球，才能得到关于这个槽的正确信息。
     * <p>
     * 给定一种颜色组合solution和一个猜测guess，编写一个方法，返回提示的结果。例如，如果颜色组合是RGBY，而你的猜测是GGRR，那么返回[1,1]，因为有一个球的颜色正确且位置正确，另一个球的颜色正确但位置不正确。
     * <p>
     * 示例：
     * <p>
     * 输入： solution="RGBY",guess="GGRR"
     * 输出： [1,1]
     * 解释： 猜测中有一个球的颜色正确且位置正确，另一个球的颜色正确但位置不正确。
     * 提示：
     * <p>
     * len(solution) = len(guess) = 4
     * solution和guess仅包含"R","G","B","Y"这4种字符
     */
    public static int[] masterMind(String solution, String guess) {
        int[] res = {0, 0};
        //使用两个列表将字符封装到List中
        List<Character> solutionList = new ArrayList<>(4);
        List<Character> guessList = new ArrayList<>(4);
        for (int i = 0; i < solution.length(); i++) {
            //先收集‘猜中’数量
            if (solution.charAt(i) == guess.charAt(i)) {
                res[0]++;
                continue;
            }
            solutionList.add(solution.charAt(i));
            guessList.add(guess.charAt(i));
        }
        //再收集‘伪猜中’数量
        //使用Iterator删除，避免出现并发修改异常
        Iterator<Character> it = solutionList.iterator();
        while (it.hasNext()) {
            Character c = it.next();
            //若猜测集合中含有当前字符，则伪猜中数量++，
            //并将两个list中的该字符去掉，避免重复统计
            if (guessList.contains(c)) {
                res[1]++;
                it.remove();
                guessList.remove(c);
            }
        }
        //‘伪猜中’项中去掉‘猜中’数目
        res[1] -= res[0];
        return res;
    }

}